/* Constants */
var VIAJE_PUNTO_ESTADO_PENDIENTE = 0;
var VIAJE_PUNTO_ESTADO_OK        = 1;
var VIAJE_PUNTO_ESTADO_ERR       = 2;

/* Setu monitoreo core */
var monitoreo = new function()
{
    // Vars mapa
    this.map        = false;
    this.mapId      = 'mapa';
    this.scrollLock = true;
    // Rutas
    this.firstRoute    = true;
    this.routesRawData = {};
    this.routePaths    = {};
    this.routes        = {};
    this.routeNum      = 0;
    this.routeColors   = Array(
        '327e04',
        'bfbf30',
        '83a697',
        '9fe855',
        '527423'
    );
    this.infoBubblesByControlPoints = {};
    // Viajes
    this.viajeIndividual    = false;
    this.viajes             = {};
    this.infoToken          = '';
    this.totalVehiculos     = 0;
    this.coloresAvailable   = 11;
    this.coloresVehiculos   = {};
    this.lastCheckTs        = 0;
    this.grupoInterval      = null;
    this.lastGeoId          = 0;
    this.pendingViajeDelete = false;
    this.pedingRutaDelete   = false;
    // Clock
    this.timeDiff      = 0;
    this.clockInterval = null;
    // Inicializar
    this.init = function(idViaje)
    {
        this.dibujarMapa();
        this.hideLoading();
        this.clockInterval = setInterval(function(){ monitoreo.tickClock(); }, 1000);
        this.grupoInterval = setInterval(function(){ monitoreo.updateGeolocaziones(); }, 1100);
        if (idViaje != undefined)
        {
            this.viajeIndividual = idViaje;
        }
        // Llamar map ready con declaraciones en el documento
        mapReady();
    }
    // Lock/unclock mapa
    this.lockMapa = function()
    {
        this.scrollLock = true;
        $('#lock_mapa').css('visibility', 'visible');
        $('#unlock_mapa').css('visibility', 'hidden');
    }
    this.unlockMapa = function()
    {
        this.scrollLock = false;
        $('#unlock_mapa').css('visibility', 'visible');
        $('#lock_mapa').css('visibility', 'hidden');
    }
    // Guardar diferencia de tiempo entre el server y el cliente
    this.setTimeDiff = function(timeDiff)
    {
        this.timeDiff = timeDiff;
    }
    // Agregar token de info para checkear cuando aparezcan rutas o vehiculos nuevos
    this.addInfoToken = function(token)
    {
        this.infoToken = token;
    }
    // Dibujar mapa
    this.dibujarMapa = function()
    {
        // Hide POIS
        var noPoi = [
        {
            featureType: "poi",
            stylers: [
              { visibility: "off" }
            ]
          }
        ];
        // Map options
        var mapOptions =
        {
            zoom                   : 15,
            mapTypeId              : google.maps.MapTypeId.ROADMAP,
            disableDoubleClickZoom : true,
            scrollwheel            : false,
            mapTypeControl         : false,
            panControl             : false,
            rotateControl          : false
        };
        this.map = new google.maps.Map(document.getElementById(this.mapId),mapOptions);
        this.map.setOptions({styles: noPoi});
    }
    // Show loading
    this.showLoading = function()
    {
        $('#mapa_loader').show();
    }
    // Hide loading
    this.hideLoading = function()
    {
        $('#mapa_loader').hide();
    }
    // Add Ruta
    this.addRuta = function(ruta)
    {
        // Agregar ruta al sistema
        this.routesRawData[ruta['id']] = ruta;
        this.routes[ruta['id']] = new google.maps.Polyline({
            strokeColor   : '#'+monitoreo.routeColors[monitoreo.routeNum],
            strokeOpacity : 0.4,
            strokeWeight  : 10
        });
        this.routes[ruta['id']].setMap(this.map);
        this.routePaths[ruta['id']] = this.routes[ruta['id']].getPath();
        // Dibujar ruta en el mapa
        for(i=0;i<ruta.camino.length;i++)
        {
            this.routePaths[ruta['id']].push(new google.maps.LatLng(ruta.camino[i].lat,ruta.camino[i].lng));
        }
        // Centrar en salida primer ruta
        if (this.firstRoute)
        {
            this.map.setCenter(new google.maps.LatLng(ruta.camino[0].lat,ruta.camino[0].lng));
            this.firstRoute = false;
        }
        // Dibujar puntos
        ruta['puntosPosRef'] = {};
        this.infoBubblesByControlPoints[ruta['id']] = {};
        for(i=0;i<ruta.puntos.length;i++)
        {
            ruta['puntosPosRef'][ruta.puntos[i]['id']] = i;
            if (i == 0)
            {
                ruta.puntos[i]['nombre'] = 'INICIO';
            }
            // Info
            var info = new InfoBubble({
                map                 : this.map,
                position            : new google.maps.LatLng(ruta.puntos[i].lat,ruta.puntos[i].lng),
                content             : '<div style="color:black; text-align:center; font-weight:bold;">'+ruta.puntos[i]['nombre']+'</div>',
                shadowStyle         : 0,
                padding             : 3,
                backgroundColor     : '#'+monitoreo.routeColors[monitoreo.routeNum],
                borderRadius        : 4,
                arrowSize           : 10,
                borderWidth         : 0,
                borderColor         : '#000000',
                disableAutoPan      : true,
                hideCloseButton     : true,
                arrowStyle          : 0
            });
            this.infoBubblesByControlPoints[ruta['id']][ruta.puntos[i]['id']] = info;
            this.infoBubblesByControlPoints[ruta['id']][ruta.puntos[i]['id']].open();
        }
        // Agregar ruta al menu
        this.appendRuta(ruta['id'], ruta['nombre'], '#'+monitoreo.routeColors[monitoreo.routeNum], ruta.puntos);
        // Increment
        this.routeNum++;
    }
    // Append ruta menu
    this.appendRuta = function(id, nombre, color, puntos)
    {
        // Append ruta en listado
        var idContent = 'ruta_content_'+id;
        var content   = '<div id="'+idContent+'"></div>'
        $('#rutas_header').append('<li><a href="#'+idContent+'">'+nombre+'</a></li>');
        $('#rutas').append(content);
        $('#rutas').tabs('refresh');
        try
        {
            $('#rutas').tabs('pagingDestroy');
        }
        catch(e)
        {

        }
        $('#rutas').tabs('paging', { follow: true, followOnActive: true });
        $('#rutas').tabs({ active: 0 });
        // Info ruta
        var clone = $('#ruta_foo').clone(true);
        clone.removeAttr('id');
        clone.attr('id', 'ruta_'+id);
        clone.attr('rutaId', id);
        clone.children('.ruta_color').css('background-color', color);
        clone.children('.ruta_icons').children('input').attr('id', 'ruta_check_'+id);
        clone.children('.ruta_icons').children('input').attr('rutaId', id);
        clone.children('.ruta_icons').children('input').bind('click', function() { monitoreo.toggleRuta(this) });
        clone.hover(
            function()
            {

                var id = $(this).attr('rutaId')*1;
                if ($('#ruta_check_'+id).is(':checked'))
                {
                    monitoreo.routes[id].setOptions({strokeOpacity: 0.8});
                    for (i in monitoreo.infoBubblesByControlPoints[id])
                    {
                        var bubble = monitoreo.infoBubblesByControlPoints[id][i];
                        $(bubble.bubble_).addClass('stroked_point');
                        bubble.setBorderWidth(2);
                    }
                }
            },
            function()
            {
                var id = $(this).attr('rutaId')*1;
                if ($('#ruta_check_'+id).is(':checked'))
                {
                    monitoreo.routes[id].setOptions({strokeOpacity: 0.4});
                    for (i in monitoreo.infoBubblesByControlPoints[id])
                    {
                        var bubble = monitoreo.infoBubblesByControlPoints[id][i];
                        $(bubble.bubble_).removeClass('stroked_point');
                        bubble.setBorderWidth(0);
                    }
                }
            }
        )
        $('#'+idContent).append(clone);
        // Puntos ruta
        var puntosContent = $('<div class="puntos"></div>');
        for(i=0;i<puntos.length;i++)
        {
            var newPunto = $('<div class="punto" idRuta="'+id+'" posPunto="'+i+'" idPunto="'+puntos[i]['id']+'" id="punto_'+puntos[i]['id']+'"><div class="punto_bg" style="background-color:'+color+'"></div><div class="punto_nombre">'+puntos[i]['nombre']+'</div><div class="punto_tiempo" id="punto_tiempo_'+puntos[i]['id']+'"></div></div>');
            newPunto.hover(
                function()
                {
                    var ruta  = $(this).attr('idRuta');
                    var punto = $(this).attr('idPunto');
                    var bubble = monitoreo.infoBubblesByControlPoints[ruta][punto];
                    $(bubble.bubble_).addClass('stroked_point');
                    bubble.setBorderWidth(2);
                },
                function()
                {
                    var ruta  = $(this).attr('idRuta');
                    var punto = $(this).attr('idPunto');
                    var bubble = monitoreo.infoBubblesByControlPoints[ruta][punto];
                    $(bubble.bubble_).removeClass('stroked_point');
                    bubble.setBorderWidth(0);
                }
            );
            puntosContent.append(newPunto);
        }
        $('#'+idContent).append(puntosContent);
    }
    // Toggle ruta
    this.toggleRuta = function(check)
    {
        if ($(check).is(':checked'))
        {
            var id = $(check).attr('rutaId')*1;
            monitoreo.routes[id].setOptions({strokeOpacity: 0.8});
            for (i in monitoreo.infoBubblesByControlPoints[id])
            {
                var bubble = monitoreo.infoBubblesByControlPoints[id][i];
                $(bubble.bubble_).removeClass('hidden_point');
            }
        }
        else
        {
            var id = $(check).attr('rutaId')*1;
            monitoreo.routes[id].setOptions({strokeOpacity: 0});
            for (i in monitoreo.infoBubblesByControlPoints[id])
            {
                var bubble = monitoreo.infoBubblesByControlPoints[id][i];
                $(bubble.bubble_).addClass('hidden_point');
            }
        }
    }
    // Agregar viaje
    this.addViaje = function(id, viajeData)
    {
        this.viajes[id] = viajeData;
        this.addVehiculo(id, viajeData.vehiculo);
    }
    // Agregar vehiculo
    this.addVehiculo = function(idViaje, vehiculoData)
    {
        // Chek pending delete
        if (this.pendingViajeDelete)
        {
            this.removeViajeData(this.pendingViajeDelete, true);
            this.pendingViajeDelete = false;
        }
        // Sum total
        this.totalVehiculos++;
        // Append vehiclo en listado
        var idContent = 'vehiculo_content_'+vehiculoData['id'];
        var content   = '<div id="'+idContent+'"></div>'
        $('#vehiculos_header').append('<li><a href="#'+idContent+'" idViaje="'+idViaje+'">'+vehiculoData['nombre']+'</a></li>');
        $('#vehiculos').append(content);
        $('#vehiculos').tabs('refresh');
        try
        {
            $('#vehiculos').tabs('pagingDestroy');
        }
        catch(e)
        {
        }
        $('#vehiculos').tabs('paging', { follow: true, followOnActive: true });
        $('#vehiculos').tabs({ active: 0 });
        // Append in map
        this.viajes[idViaje]['vehiculo']['images'] = this.getColorVehiculo();
        this.viajes[idViaje]['vehiculo']['marker'] = new google.maps.Marker(
        {
            position : new google.maps.LatLng(monitoreo.routesRawData[monitoreo.viajes[idViaje]['fkruta']]['puntos'][0].lat , monitoreo.routesRawData[monitoreo.viajes[idViaje]['fkruta']]['puntos'][0].lng),
            map      : this.map,
            icon     : new google.maps.MarkerImage(monitoreo.viajes[idViaje]['vehiculo']['images'], new google.maps.Size(30, 30), new google.maps.Point(0, 0), new google.maps.Point(15, 30))
        });
        // Info vehiculo
        this.viajes[idViaje]['salida_timestamp'] = this.viajes[idViaje]['salida_timestamp']*1;
        this.viajes[idViaje]['llegada_timestamp'] = this.viajes[idViaje]['llegada_timestamp']*1;
        var clone = $('#vehiculo_foo').clone(true);
        clone.removeAttr('id');
        clone.attr('id', 'vehiculo_'+vehiculoData['id']);
        clone.attr('vehiculoId', vehiculoData['id']);
        clone.attr('viajeId', idViaje);
        clone.find('.vehiculo_color_image').attr('src', this.viajes[idViaje]['vehiculo']['images']);
        clone.children('.vehiculo_nombre').html(vehiculoData['nombre'] + ' (Nro '+vehiculoData['numero']+')');
        clone.children('.vehiculo_conductor').html('<strong>Conductor:</strong> '+this.viajes[idViaje]['conductor']['nombre']+' '+this.viajes[idViaje]['conductor']['apellido']);
        clone.children('.vehiculo_salida').html('<strong>Salida:</strong> '+this.timeConverter(this.viajes[idViaje]['salida_timestamp']+this.timeDiff));
        clone.children('.vehiculo_llegada_esperada').html('<strong>Llegada Original:</strong> '+this.timeConverter(this.viajes[idViaje]['llegada_timestamp']+this.timeDiff));
        clone.children('.vehiculo_ruta').html('<strong>Ruta:</strong> '+this.routesRawData[this.viajes[idViaje]['fkruta']]['nombre']);
        clone.find('.vehiculo_llegada_real_value').attr('id', 'vehiculo_llegada_real_value_'+vehiculoData['id']);
        clone.find('.vehiculo_velocidad_value').attr('id', 'velocidad_vehiculo_'+vehiculoData['id']);
        clone.find('.vehiculo_proximo_punto_value').attr('id', 'proximo_vehiculo_'+vehiculoData['id']);
        clone.find('.vehiculo_proximo_punto_llegada_value').attr('id', 'proximo_vehiculo_llegada_'+vehiculoData['id']);
        this.viajes[idViaje]['vehiculo']['lastCheckTs'] = 0;
        // Puntos
        this.viajes[idViaje]['vehiculo']['puntos'] = {};
        var puntos = Array();
        for (i=0; i<monitoreo.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'].length; i++)
        {
            // Info
            this.viajes[idViaje]['vehiculo']['puntos'][this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['id']] = {'estado': VIAJE_PUNTO_ESTADO_PENDIENTE, 'hora':0};
            // Append
            var puntoClone = $('#vehiculo_punto_foo').clone(true);
            puntoClone.attr('id', 'vehiculo_'+vehiculoData['id']+'_punto_'+this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['id']);
            puntoClone.children('.vehiculo_punto_nombre').attr('id', 'vehiculo_'+vehiculoData['id']+'_punto_'+this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['id']+'_nombre').html(monitoreo.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['nombre']);
            puntoClone.children('.vehiculo_punto_estado').attr('id', 'vehiculo_'+vehiculoData['id']+'_punto_'+this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['id']+'_estado').html('<img src="/images/monitoreo/punto_estado_pendiente.png?ts=1" height="100%" />');
            puntoClone.children('.vehiculo_punto_hora').attr('id', 'vehiculo_'+vehiculoData['id']+'_punto_'+this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][i]['id']+'_hora').html('--:--');
            clone.children('.vehiculo_puntos_info').append(puntoClone);
        }
        // Append
        $('#'+idContent).append(clone);
    }
    // Get color vehiculo
    this.getColorVehiculo = function()
    {
        var max = ((Math.floor(this.totalVehiculos / this.coloresAvailable)) + 1);
        var ret = false;
        for (i=0;i<this.coloresAvailable;i++)
        {
            if (this.coloresVehiculos[i] == undefined)
            {
                this.coloresVehiculos[i] = 0;
            }
            if (this.coloresVehiculos[i] < max)
            {
                ret = (i+1);
                this.coloresVehiculos[i]++;
                break;
            }
        }
        return '/images/monitoreo/vehiculo_color_'+ret+'.png';
    }
    // Parse geolocalizacion
    this.parseGeolocalizacion = function(geoLocalizacion, updateOnScreen)
    {
        for (i in geoLocalizacion)
        {
            if (geoLocalizacion[i])
            {
                geoLocalizacion[i] = geoLocalizacion[i]*1;
            }
        }
        if (this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['lastCheckTs']  == undefined)
        {
            this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['lastCheckTs']  = 0;
        }
        if (geoLocalizacion['idgeolocalizacion'] > this.lastGeoId)
        {
            this.lastGeoId = geoLocalizacion['idgeolocalizacion'];
        }
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['lat']         = geoLocalizacion['latitud'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['lng']         = geoLocalizacion['longitud'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['proximoId']   = geoLocalizacion['fkproximo_punto'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['proximoTs']   = geoLocalizacion['proximo_punto_timestamp'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['velocidad']   = geoLocalizacion['velocidad'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['fkpunto']     = geoLocalizacion['fkpunto_por_ruta'];
        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['lastCheckTs'] = geoLocalizacion['fecha_timestamp'];
        if (geoLocalizacion['fkpunto_por_ruta'])
        {
            if (this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][geoLocalizacion['fkpunto_por_ruta']] != undefined)
            {
                if (this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][geoLocalizacion['fkpunto_por_ruta']]['estado'] == VIAJE_PUNTO_ESTADO_PENDIENTE)
                {
                    $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+geoLocalizacion['fkpunto_por_ruta']).addClass('vehiculo_punto_ok');
                    $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+geoLocalizacion['fkpunto_por_ruta']+'_estado').html('<img src="/images/monitoreo/punto_estado_ok.png?ts=1" height="100%" />');
                    $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+geoLocalizacion['fkpunto_por_ruta']+'_hora').html(this.getHoraGeolocazion(geoLocalizacion['fecha_timestamp']));
                    this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][geoLocalizacion['fkpunto_por_ruta']]['estado'] = VIAJE_PUNTO_ESTADO_OK;
                    this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][geoLocalizacion['fkpunto_por_ruta']]['hora']   = geoLocalizacion['fecha_timestamp'];
                    // Check if ultimo punto y fin de viaje
                    if (this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntosPosRef'][geoLocalizacion['fkpunto_por_ruta']] == (this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntos'].length - 1))
                    {
                        this.viajes[geoLocalizacion['fkviaje']]['finished'] = true;
                        this.viajes[geoLocalizacion['fkviaje']]['hora_fin'] = this.getHoraGeolocazion(geoLocalizacion['fecha_timestamp']);
                        notice('El monitoreo para el viaje ' + (this.viajes[geoLocalizacion['fkviaje']]['nombre']) + ' ha finalizado');
                        setTimeout(function(){ $('#dialog').dialog( "close" ); }, 3000);
                        if (!this.viajeIndividual)
                        {
                            this.removeViajeData(geoLocalizacion['fkviaje']);
                        }
                    }
                }
                // Check anterior
                var posRef = this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntosPosRef'][geoLocalizacion['fkpunto_por_ruta']];
                if (posRef > 0)
                {
                    var posSubstract = 1;
                    var idAnterior = this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntos'][posRef-posSubstract]['id'];
                    while(this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][idAnterior]['estado'] == VIAJE_PUNTO_ESTADO_PENDIENTE)
                    {
                        this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][idAnterior]['estado'] = VIAJE_PUNTO_ESTADO_ERR;
                        // Cambiar estados
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior).addClass('vehiculo_punto_err');
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior+'_estado').html('<img src="/images/monitoreo/punto_estado_err.png?ts=1" height="100%" />');
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior+'_hora').html('No pas&oacute;');
                        // Anterior
                        posSubstract++;
                        idAnterior = this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntos'][posRef-posSubstract]['id'];
                    }
                    /*
                    var idAnterior = this.routesRawData[this.viajes[geoLocalizacion['fkviaje']]['fkruta']]['puntos'][posRef-1]['id'];
                    if (this.viajes[geoLocalizacion['fkviaje']]['vehiculo']['puntos'][idAnterior]['estado'] == VIAJE_PUNTO_ESTADO_PENDIENTE)
                    {
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior).addClass('vehiculo_punto_err');
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior+'_estado').html('<img src="/images/monitoreo/punto_estado_err.png?ts=1" height="100%" />');
                        $('#vehiculo_'+geoLocalizacion['fkvehiculo']+'_punto_'+idAnterior+'_hora').html('No pas&oacute;');
                    }
                    */
                }
            }
        }
        // Update
        if ((updateOnScreen == undefined) || (updateOnScreen))
        {
            this.updateViaje(geoLocalizacion['fkviaje']);
        }
    }
    // Parse primer carga de geolocaziones
    this.parsePrimerCargaDeGeolocaziones = function()
    {
        // Por vehiculo
        for (idViaje in this.viajes)
        {
            this.updateViaje(idViaje);
        }
    }
    // Update viaje desde informacion actualizada
    this.updateViaje = function(idViaje)
    {
        if ((this.viajes[idViaje]['deleted'] != undefined) && (this.viajes[idViaje]['deleted']))
        {
            return false;
        }
        var idVehiculo = this.viajes[idViaje]['vehiculo']['id'];
        // Velocidad
        if (this.viajes[idViaje]['vehiculo']['velocidad'] == undefined)
        {
            this.viajes[idViaje]['vehiculo']['velocidad'] = 0;
        }
        document.getElementById('velocidad_vehiculo_'+idVehiculo).innerHTML = this.viajes[idViaje]['vehiculo']['velocidad'];
        // Posicion
        if (this.viajes[idViaje]['vehiculo']['marker'] != undefined)
        {
            this.viajes[idViaje]['vehiculo']['marker'].setPosition(new google.maps.LatLng(this.viajes[idViaje]['vehiculo']['lat'],this.viajes[idViaje]['vehiculo']['lng']));
            if (this.viajeIndividual)
            {
                if (this.scrollLock)
                {
                    this.map.setCenter(new google.maps.LatLng(this.viajes[idViaje]['vehiculo']['lat'],this.viajes[idViaje]['vehiculo']['lng']));
                }
            }
            else
            {
                if (this.scrollLock)
                {
                    // Vehiculo activo
                    if ($('#'+$('#vehiculos .ui-tabs-active').attr('aria-controls')).children('.vehiculo_info').attr('viajeId'))
                    {
                        var selectedViajeId = $('#'+$('#vehiculos .ui-tabs-active').attr('aria-controls')).children('.vehiculo_info').attr('viajeId') * 1;
                        if (idViaje == selectedViajeId)
                        {
                            this.map.setCenter(new google.maps.LatLng(this.viajes[idViaje]['vehiculo']['lat'],this.viajes[idViaje]['vehiculo']['lng']));
                        }
                    }
                }
            }
        }
        // Fin ?
        if (this.viajes[idViaje]['finished'])
        {
            $('#proximo_vehiculo_'+idVehiculo).parent().hide();
            $('#proximo_vehiculo_llegada_'+idVehiculo).parent().hide();
            $('#velocidad_vehiculo_'+idVehiculo).parent().hide();
            $('#vehiculo_llegada_real_value_'+idVehiculo).html(this.viajes[idViaje]['hora_fin']);
            $('#vehiculo_llegada_real_value_'+idVehiculo).html(this.viajes[idViaje]['hora_fin']).parent().show();
        }
        else
        {
            // Proximo
            if (this.viajes[idViaje]['vehiculo']['proximoId'] != undefined)
            {
                var puntoId = this.viajes[idViaje]['vehiculo']['proximoId'];
                document.getElementById('proximo_vehiculo_'+idVehiculo).innerHTML = this.routesRawData[this.viajes[idViaje]['fkruta']]['puntos'][this.routesRawData[this.viajes[idViaje]['fkruta']]['puntosPosRef'][puntoId]]['nombre'];
            }
            if (this.viajes[idViaje]['vehiculo']['proximoTs'] != undefined)
            {
                var next = this.viajes[idViaje]['vehiculo']['proximoTs'] - Math.round(new Date().getTime()/1000.0) + this.timeDiff;
                var secs = this.secondsToTime(next);
                if (secs != '')
                {
                    document.getElementById('proximo_vehiculo_llegada_'+idVehiculo).innerHTML = secs;
                }
                if (puntoId != undefined)
                {
                    if (secs != '')
                    {
                        document.getElementById('vehiculo_'+idVehiculo+'_punto_'+puntoId+'_hora').innerHTML = secs;
                    }
                    // Estimar horario proximos puntos
                    var fkruta = this.viajes[idViaje]['fkruta'];
                    var proximoPos = this.routesRawData[fkruta]['puntosPosRef'][puntoId];
                    var totPuntos  = this.routesRawData[fkruta]['puntos'].length;
                    if ((proximoPos+1) <= (totPuntos - 1))
                    {
                        var llegada = next;
                        for (i=(proximoPos+1);i<=(totPuntos-1);i++)
                        {
                            // Check if franja or default
                            llegada += this.routesRawData[fkruta]['puntos'][i]['segundos_anterior'];
                            var auxId = this.routesRawData[fkruta]['puntos'][i]['id'];
                            document.getElementById('vehiculo_'+idVehiculo+'_punto_'+auxId+'_hora').innerHTML = this.secondsToTime(llegada);
                        }
                    }
                }
            }
        }
        return true;
    }
    // Actualizar grupo
    this.updateGeolocaziones = function()
    {
        if (this.viajeIndividual)
        {
            var data = {'fkviaje':this.viajeIndividual, 'lastGeoId':this.lastGeoId};
        }
        else
        {
            var data = {'token':this.infoToken};
        }
        $.getJSON('/monitoreo/geolocalizaciones/', data )
            .done(function(data)
            {
                if (data.err == undefined)
                {
                    var serverTs = false;
                    if (data.server_ts != undefined)
                    {
                        serverTs = data.server_ts*1;
                        var timeDiff = serverTs - Math.round(new Date().getTime()/1000.0);
                        monitoreo.setTimeDiff(timeDiff);
                    }
                    if (data.rutas != undefined)
                    {
                        for (i in data.rutas)
                        {
                            if (i != 'remove')
                            {
                                var rutaAux = data.rutas[i];
                                var ruta = {'id': rutaAux['idruta']*1, 'nombre':rutaAux['nombre_ruta'], 'camino':Array(), 'puntos':Array()};
                                for (i in rutaAux.puntos_camino)
                                {
                                    ruta['camino'].push({'lat':rutaAux.puntos_camino[i]['lat']*1, 'lng':rutaAux.puntos_camino[i]['lng']*1});
                                }
                                for (i in rutaAux.puntos)
                                {
                                    ruta['puntos'].push({'id': rutaAux.puntos[i]['idpunto_por_ruta']*1, 'lat': rutaAux.puntos[i]['latitud']*1, 'lng': rutaAux.puntos[i]['longitud']*1, 'nombre': rutaAux.puntos[i]['nombre'], 'segundos_anterior':rutaAux.puntos[i]['segundos_anterior']*1});
                                }
                                monitoreo.addRuta(ruta);
                            }
                        }
                    }
                    if (data.viajes != undefined)
                    {
                        for (i in data.viajes)
                        {
                            if (i != 'remove')
                            {
                                monitoreo.addViaje(data.viajes[i]['id'], data.viajes[i]);
                            }
                        }
                    }
                    if (data.geolocalizaciones != undefined)
                    {
                        for (idGeo in data.geolocalizaciones)
                        {
                            monitoreo.parseGeolocalizacion(data.geolocalizaciones[idGeo]);
                        }
                    }
                }
            });
    }
    // Utils
    this.timeConverter = function(UNIX_timestamp, splitted)
    {
        var a = new Date(UNIX_timestamp*1000);
        var year = a.getFullYear();
        var month = a.getMonth() + 1;
        var date = a.getDate();
        var hour = a.getHours();
        var min = a.getMinutes();
        var sec = a.getSeconds();
        if (splitted == undefined)
        {
            var time = date+'/'+this.twoDigits(month)+'/'+year+' '+this.twoDigits(hour)+':'+this.twoDigits(min)+':'+this.twoDigits(sec) ;
            return time;
        }
        else
        {
            return {'date':date+'/'+this.twoDigits(month)+'/'+year, 'time': this.twoDigits(hour)+':'+this.twoDigits(min)+':'+this.twoDigits(sec)};
        }
    }
    this.twoDigits = function(value)
    {
        if(value < 10)
        {
            return '0' + value;
        }
        return value;
    }
    this.tickClock = function()
    {
        var now = Math.round(new Date().getTime()/1000.0);
        var time = this.timeConverter(now, true);
        document.getElementById('clock_date').innerHTML = time['date'];
        document.getElementById('clock_time').innerHTML = time['time'];
    }
    this.secondsToTime = function(sec_num)
    {
        if (sec_num > 0)
        {
            var hours   = Math.floor(sec_num / 3600);
            var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
            var seconds = sec_num - (hours * 3600) - (minutes * 60);
            return (this.twoDigits(hours)+':'+this.twoDigits(minutes)+':'+this.twoDigits(seconds));
        }
        else
        {
            return '';
        }
    }
    this.getHoraGeolocazion = function(UNIX_timestamp)
    {
        var a     = new Date(UNIX_timestamp*1000 + this.timeDiff) ;
        var year  = a.getFullYear();
        var month = a.getMonth() + 1;
        var date  = a.getDate();
        var hour  = a.getHours();
        var min   = a.getMinutes();
        var sec   = a.getSeconds();
        return (this.twoDigits(hour)+':'+this.twoDigits(min)+':'+this.twoDigits(sec));
    }
    this.removeViajeData = function(idViaje, force)
    {
        if (($('#vehiculos >ul >li').size() > 1) || (force != undefined))
        {
            var tabId = 'vehiculo_content_'+this.viajes[idViaje]['vehiculo']['id'];
            $('a[href$="'+tabId+'"]').parent().remove();
            $('#'+tabId).remove();
            $('#vehiculos').tabs('refresh');
            this.viajes[idViaje]['deleted'] = true;
            this.viajes[idViaje]['vehiculo']['marker'].setMap(null);
            this.totalVehiculos--;
        }
        else
        {
            this.pendingViajeDelete = idViaje;
        }
    }
};